#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <map>
#include "Predictor.h"
#include "ARPAParser.h"
#include "SistemaDelTestSet.h"
#include "ParserTestSet.h"
#include <ctime>
using namespace std;

//CONTRASENA ALE = qu4xR7jz3Yq3

int main() {
	clock_t start;
	const char* rutaARPA = "/home/ale/Desktop/Organizacion_de_datos/TP_Kaggle/MIT/mitlm-0.4.1/output.lm";
	const char* rutaTestSet = "/home/ale/Desktop/Entregable/test_v2.txt";
	const char* archivoSalida = "SALIDAleito.txt";
	SistemaDelTestSet sistem(rutaARPA, rutaTestSet, archivoSalida);

	sistem.procesarARPAfile();

	start = clock();
	//sistem.agregarMejoresTrigramasParaBigramas();
	cout << "Tiempo de encontrar mejores trigramas: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms";
	cout << endl;

	start = clock();
	//sistem.agregarMejoresBigramasParaUnigramas();
	cout << "Tiempo de encontrar mejores bigramas: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms";
	cout << endl;

	sistem.pruebas();

	int cantOracionesEnTestSet = 306681;

	size_t desde = 0;
	//size_t hasta = 150000;
	//size_t desde = 150000;
	//size_t hasta = 200000;
	//size_t desde = 200000;
	size_t hasta = cantOracionesEnTestSet;


//35616
	sistem.parserTestSet->cargarArchivo();
	//for (int n=0 ; n < 150000; n++)
	//	sistem.parserTestSet->saltearSiguienteOracion();

	start = clock();
	cout << "subiendo las oraciones a memoria: " << endl;
	sistem.parserTestSet->cargarSetPruebaEnMemoria(desde, hasta-1);
	cout << "Tiempo de subir las oraciones a memoria: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms";
	cout << endl;

	float h = 10000;
	start = clock();
	cout << "ARRANCA CON EL TEST SET" << endl;
	for (unsigned int i=desde; i<hasta;i++){//cantOracionesEnTestSet-1; i++){ //i es la cantidad de oraciones que queremos que complete
		if (i >= h){
			cout << "Voy por: " << (h/cantOracionesEnTestSet);
			cout << "    Tiempo desde inicio: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms" << endl;
			h+= 10000;
		}
		sistem.procesarSetPrueba();
	}
	cout << "Tiempo de completar las oraciones: " << (std::clock() - start) / (double)(CLOCKS_PER_SEC / 1000) << " ms";
	cout << endl;

	sistem.parserTestSet->escribirOracionesEnArchivo(desde, hasta-1);
	sistem.imprimirNoPrecide();

}
